package demo.sicua.votesystem.service.imp;

import demo.sicua.votesystem.constant.DataConstant;
import demo.sicua.votesystem.dao.AdminDao;
import demo.sicua.votesystem.dao.UserDao;
import demo.sicua.votesystem.entity.PO.AdminPO;
import demo.sicua.votesystem.entity.PO.UserPO;
import demo.sicua.votesystem.entity.VO.ResultVO;
import demo.sicua.votesystem.service.UserService;
import demo.sicua.votesystem.util.ResultVOUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 加入bean
 */
@Service
public class UserServiceImp implements UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private ResultVOUtil resultVOUtil;

    @Override
    public ResultVO getAllUser() {
        try{
            List<UserPO> userPOList = userDao.selectUsers();
            if (userPOList.size() == 0){
                return resultVOUtil.success("没有用户");
            }else{
                return resultVOUtil.success(userPOList);
            }

        }catch (Exception e){
            e.printStackTrace();
            return resultVOUtil.unkwonError();
        }
    }

    @Override
    public ResultVO login(String username, String password, HttpServletRequest request) {
        /**
         * 可做字符限制
         */
        if("".equals(username.trim()) && "".equals(password.trim())){
            // 用户传入的用户密码不能为空字符
            return resultVOUtil.paramError();
        }else {
            try{
                // 执行查询操作，可能抛出异常，所以需要try catch
                UserPO userPO = userDao.selectUsersByPwdAndUsername(username,password);
                if (userPO == null){
                    return resultVOUtil.resourceNotFound();
                }else{
                        //存放用户凭据，存入session中
                        HttpSession session = request.getSession();
                        // 存放用户的id到会话session中，第一个参数是键，第二个参数是值
                        session.setAttribute(DataConstant.USER_SESSION_NAME,userPO.getId());

                        // 用户信息不为空，登录成功,返回凭据
                        return resultVOUtil.success(userPO.getAdmin(),"用户登录成功");
                    }
            }catch (Exception e){
                // 打印异常堆栈信息
                e.printStackTrace();
                // 一旦抛出异常就返回未知错误信息
                return resultVOUtil.unkwonError();
            }
        }
    }

    @Override
    public ResultVO getUser(int page, int limit) {

        /* 判断用户是否登录并且拥有授权*/

        try{
            Map<String,Object> resMap = new HashMap<>();
            int count = userDao.selectUserCount();
            if (count == 0){
                // 如果数据库中没有用户，可以不进行分页查找
                return  resultVOUtil.success(resMap);
            }else {
                // 分页查询用户列表
                List<UserPO> userPOList = userDao.selectUsersByPaging( (page - 1)*limit,limit);
                resMap.put("users",userPOList);
                return resultVOUtil.success(resMap);
            }

        }catch (Exception e){
            //  打印出异常信息
            e.printStackTrace();
            // 返回错误状态，并且返回一个错误信息
            return resultVOUtil.unkwonError(e.getMessage());
        }
    }

    @Override
    public ResultVO deleteUserById(String uid) {
        if ("".equals(uid.trim())){
            return resultVOUtil.paramError();
        }else {
            try{
                UserPO userPO = userDao.selectUserById(uid);
                if (userPO == null){
                    return resultVOUtil.resourceNotFound("用户不存在");
                }else {
                    // 如果不为空，表示该用户存在，继续进行删除操作
                    boolean hasDelete = userDao.deleteUserById(uid);
                    if (hasDelete){
                        return resultVOUtil.success();
                    }else {
                        return resultVOUtil.unkwonError();
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
                return resultVOUtil.unkwonError(e.getMessage());
            }
        }
    }

    @Override
    public ResultVO addUser(UserPO userPO) {
        try{
            // 先查询数据库中是否有这一个username所对应的用户
            UserPO hasExistence = userDao.selectUserByName(userPO.getUsername());
            if(hasExistence == null){
                boolean hasInsert = userDao.insertUser(userPO);
                if (hasInsert){
                    return resultVOUtil.success();
                }else {
                    return resultVOUtil.unkwonError();
                }
            }else{
                return resultVOUtil.resourceExist("该用户已存在");
            }
        }catch (Exception e){
            e.printStackTrace();
            return resultVOUtil.unkwonError(e.getMessage());
        }
    }

    @Override
    public ResultVO updateUser(UserPO userPO) {
        try{
            // 先查询数据库中是否有这一个username所对应的用户
            UserPO userPO1 = userDao.selectUserById(userPO.getId());
            if(userPO1 != null){
                boolean hasInsert = userDao.updateUser(userPO);
                if (hasInsert){
                    return resultVOUtil.success();
                }else {
                    return resultVOUtil.unkwonError();
                }
            }else {
                return resultVOUtil.resourceNotFound();
            }
        }catch (Exception e){
            e.printStackTrace();
            return resultVOUtil.unkwonError(e.getMessage());
        }
    }
}
